import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///这个重用解析器，用于解析形如 "[数字] + [数字]" 的字符串。
class EReuseParser extends StatefulWidget {
  const EReuseParser({super.key});

  @override
  State<EReuseParser> createState() => _EReuseParserState();
}

class _EReuseParserState extends State<EReuseParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('重用解析器'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"1 + 2" 和 "3 + 4"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    resultStr = '';
    // 创建一个解析器，用于解析一个数字字符并将其转换为整数
    final digitParser = digit().flatten().map(int.parse);

    // 创建一个解析器，用于解析 '+' 字符并忽略其两边的空白字符
    final addParser = char('+').trim();

    // 使用 `seq` 方法将 `digitParser` 和 `addParser` 组合成一个解析器
    // 这个解析器可以解析形如 "[数字] + [数字]" 的字符串
    final addExpressionParser = digitParser.seq(addParser).seq(digitParser);

    // 使用 `addExpressionParser` 来解析字符串 '1 + 2'
    final addResult1 = addExpressionParser.parse('1 + 2');
    if (addResult1.isSuccess) {
      // 如果解析成功，打印出两个数字的和
      final values = addResult1.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      resultStr = '$firstNumber\n\n$secondNumber';
      print('The sum is ${firstNumber + secondNumber}');
    } else {
      resultStr = 'Invalid input';
      // 如果解析失败，打印 'Invalid input'
      print('Invalid input');
    }

    // 再次使用 `addExpressionParser` 来解析字符串 '3 + 4'
    // 这里我们重用了 `addExpressionParser` 解析器
    final addResult2 = addExpressionParser.parse('3 + 4');
    if (addResult2.isSuccess) {
      // 如果解析成功，打印出两个数字的和
      final values = addResult2.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      resultStr = '$resultStr\n\n$firstNumber\n\n$secondNumber';
      print('The sum is ${firstNumber + secondNumber}');
    } else {
      resultStr = '$resultStr\n\n$invalidStr';
      // 如果解析失败，打印 'Invalid input'
      print('Invalid input');
    }
  }
}
